const axios = require('axios');
const fs = require('fs');
const nodemailer = require('nodemailer');
const archiver = require('archiver');
// 封装成异步方法   下载保存文件
async function downloadFile(url, outputFilePath) {
	console.log(url, outputFilePath, '配置')
	return new Promise((resolve, reject) => {
		axios({
			method: 'get',
			url: url,
			responseType: 'stream'
		}).then(response => {
			const writer = fs.createWriteStream(outputFilePath);

			return new Promise((resolveStream, rejectStream) => {
				response.data.pipe(writer);

				let error = null;
				writer.on('error', err => {
					error = err;
					writer.close();
					rejectStream(err);
				});
				writer.on('close', () => {
					if (!error) {
						resolveStream(true);
					}
				});
			});
		}).then(() => {
			resolve(`File downloaded and saved to ${outputFilePath}`);
		}).catch(err => {
			reject(`Error downloading file: ${err.message}`);
		});
	});
}


function sendEamil(toEamil, filename, path) {
	return new Promise((resolve, reject) => {
		const senderAddress = 'chenliuxiang2024@yeah.net'
		let transporter = nodemailer.createTransport({
			service: 'yeah',
			host: 'smtp.yeah.net', // 使用 Gmail 服务，也可以设置其他 SMTP 服务器  
			port: 465,
			auth: {
				user: senderAddress, // 你的电子邮件地址  
				pass: 'REBCXCMLQERIRAZT' // 你的电子邮件密码（或者使用应用专用密码，如果启用了）  
			}
		});
		let mailOptions = {
			from: senderAddress, // 发件人地址  
			to: toEamil, // 收件人地址  
			subject: '小红薯条数据准备完毕', // 邮件主题  
			text: '请点击附件下载', // 邮件正文（纯文本）  
			attachments: [
				// 附加文件  
				{   // 使用文件路径  
					filename: filename + '.zip', // 附件的文件名，在邮件中显示  
					path: path, // 文件的本地路径  
					contentType: 'application/zip' // 明确的 MIME 类型
				},
				// 你可以添加更多附件，只需在数组中添加更多对象即可  
			]
			// html: '<b>Hello world?</b>' // 邮件正文（HTML 格式，如果需要的话）  
		};
		transporter.sendMail(mailOptions, function (error, info) {
			if (error) {
				reject()
				return console.log(error);
			}
			resolve()
			console.log('Message sent: ' + info.response);
		});
	})
}



// 封装压缩文件夹并删除 ZIP 的方法  
async function compressAndDeleteFolder(sourceDir, outputZipPath, cb) {
	// 创建一个输出流用于写入 ZIP 文件  
	const output = fs.createWriteStream(outputZipPath);

	// 创建一个新的 archiver 实例  
	const archive = archiver('zip', {
		zlib: { level: 9 } // 设置压缩级别  
	});

	// 监听所有警告  
	archive.on('warning', function (err) {
		if (err.code === 'ENOENT') {
			console.warn(err);
		} else {
			throw err;
		}
	});

	// 监听错误  
	archive.on('error', function (err) {
		throw err;
	});

	// 管道归档数据到文件  
	archive.pipe(output);

	// 压缩目录  
	archive.directory(sourceDir, false);

	// 完成归档  
	await new Promise((resolve, reject) => {
		archive.finalize();
		output.on('close', resolve);
		archive.on('error', reject);
	});
	await cb(outputZipPath)
	fs.unlink(outputZipPath, (err) => {
		if (err) {
			console.error('Error deleting ZIP file:', err);
		} else {
			console.log('ZIP file has been deleted.');
		}
	});
	// 删除 ZIP 文件  

}
module.exports = {
	downloadFile,
	compressAndDeleteFolder,
	sendEamil
};